package com.efrei.schoolmanager.views;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import com.efrei.schoolmanager.controlers.ControleurEleves;
import com.efrei.schoolmanager.model.ModeleListeEleves;
import com.efrei.schoolmanager.model.obj.Classe;
import com.efrei.schoolmanager.model.obj.Eleve;
import com.efrei.schoolmanager.views.components.CustomButton;

public class VueRechercherEleve extends JDialog {
	private static final long serialVersionUID = 1795827938015780207L;

	private final ControleurEleves controleur;

	private final static String TITLE = "Rechercher un élève";

	private final JFrame proprio;

	// JPanels
	private JPanel titlePanel, mainPanel, resultatsPanel,
			criteresRecherchePanel, validationPanel;

	// JLabels
	private JLabel titleLabel, matiereClasseLabel, resultatsLabel;

	// JComboBox
	private JComboBox matiereClasseComboBox;

	// CustomButton
	private CustomButton selectionEleveButton;

	// JTable
	private JTable elevesTable;
	private JScrollPane tableau;

	private Eleve retour;

	public VueRechercherEleve(JFrame frame, ControleurEleves controleur) {
		super(frame, TITLE, true);

		// Initialiser le controleur
		this.controleur = controleur;

		proprio = frame;
		initLabels();
		initComboBox();
		initButtons();
		initTable();
		remplirTitlePanel();
		remplirResultatsPanel();
		remplirCriteresRecherchePanel();
		remplirValidationPanel();
		remplirMainPanel();
		configurerVue();
	}

	public Eleve showDialog() {
		setVisible(true);
		return retour;
	}

	private void remplirTitlePanel() {
		titlePanel = new JPanel();
		titlePanel.add(titleLabel);
	}

	private void remplirMainPanel() {
		mainPanel = new JPanel();
		// Gestionnaire de positionnement
		GroupLayout layout = new GroupLayout(mainPanel);
		mainPanel.setLayout(layout);
		// Espacement des composants
		layout.setAutoCreateGaps(true);
		// Espacement entre composants et conteneur
		layout.setAutoCreateContainerGaps(true);

		// Groupe sequentiel sur l'axe horizontal
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		// 1e colonne
		hGroup.addGroup(layout.createParallelGroup()
				.addComponent(criteresRecherchePanel)
				.addComponent(resultatsPanel).addComponent(validationPanel));
		layout.setHorizontalGroup(hGroup);

		// Groupe sequentiel sur l'axe vertical
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		// 1e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(criteresRecherchePanel));
		// 2e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(resultatsPanel));
		// 3e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(validationPanel));
		layout.setVerticalGroup(vGroup);
	}

	private void remplirValidationPanel() {
		validationPanel = new JPanel();
		validationPanel.add(selectionEleveButton);

	}

	private void remplirCriteresRecherchePanel() {
		criteresRecherchePanel = new JPanel();
		// Gestionnaire de positionnement
		GroupLayout layout = new GroupLayout(criteresRecherchePanel);
		criteresRecherchePanel.setLayout(layout);
		// Espacement des composants
		layout.setAutoCreateGaps(true);
		// Espacement entre composants et conteneur
		layout.setAutoCreateContainerGaps(true);

		// Groupe sequentiel sur l'axe horizontal
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		// 1e colonne
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				matiereClasseLabel));
		// 2e colonne
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				matiereClasseComboBox));
		layout.setHorizontalGroup(hGroup);

		// Groupe sequentiel sur l'axe vertical
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		// 1e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(matiereClasseLabel));
		// 2e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(matiereClasseComboBox));
		// 3e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE));
		layout.setVerticalGroup(vGroup);

	}

	private void remplirResultatsPanel() {
		resultatsPanel = new JPanel();
		// Gestionnaire de positionnement
		GroupLayout layout = new GroupLayout(resultatsPanel);
		resultatsPanel.setLayout(layout);
		// Espacement des composants
		layout.setAutoCreateGaps(true);
		// Espacement entre composants et conteneur
		layout.setAutoCreateContainerGaps(true);

		// Groupe sequentiel sur l'axe horizontal
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		// 1e colonne
		hGroup.addGroup(layout.createParallelGroup()
				.addComponent(resultatsLabel).addComponent(tableau));
		layout.setHorizontalGroup(hGroup);

		// Groupe sequentiel sur l'axe vertical
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		// 1e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(resultatsLabel));
		// 2e ligne
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(tableau));
		layout.setVerticalGroup(vGroup);

	}

	/**
	 * Configurer les options de la vue
	 * 
	 */
	private void configurerVue() {
		setLayout(new BorderLayout());
		this.add(titlePanel, BorderLayout.NORTH);
		this.add(mainPanel, BorderLayout.CENTER);
		Dimension preferedSize = getPreferredSize();
		Dimension dimensionIdeale = new Dimension(preferedSize.width,
				preferedSize.height + 28);
		setMinimumSize(dimensionIdeale);
		setSize(dimensionIdeale);
		this.setLocationRelativeTo(proprio);
	}

	/**
	 * Initialiser la jtable avec son modéle permettant des filtres et une
	 * communication avec le controleur
	 */
	private void initTable() {
		ModeleListeEleves modele = new ModeleListeEleves(controleur);
		elevesTable = new JTable(modele);
		tableau = new JScrollPane(elevesTable);
	}

	private void initButtons() {
		SelectionEleveButtonListener selectionEleveListener = new SelectionEleveButtonListener();
		selectionEleveButton = new CustomButton("Valider selection");
		selectionEleveButton.addActionListener(selectionEleveListener);
	}

	private void initComboBox() {
		MatiereClasseComboBoxListener matiereClasseListener = new MatiereClasseComboBoxListener();

		matiereClasseComboBox = new JComboBox();

		// Remplir les matieres
		matiereClasseComboBox.removeAllItems();
		matiereClasseComboBox.addItem("--Selectionnez une classe--");
		List<Classe> classes = controleur.getClasses();
		for (Classe classe : classes) {
			matiereClasseComboBox.addItem(classe);
		}
		matiereClasseComboBox.setSelectedIndex(0);

		matiereClasseComboBox.addActionListener(matiereClasseListener);
		matiereClasseComboBox.setVisible(true);
	}

	private void initLabels() {
		titleLabel = new JLabel(TITLE);
		titleLabel.setFont(new Font("Arial", Font.BOLD, 20));
		matiereClasseLabel = new JLabel("Rechercher par:");
		resultatsLabel = new JLabel("Resultats de la recherche");
	}

	class SelectionEleveButtonListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			int ligne = elevesTable.getSelectedRow();
			if (ligne != -1) {
				retour = controleur.getEleves().get(ligne);
				setVisible(false);
			}
		}
	}

	class MatiereClasseComboBoxListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			Classe filter = null;
			if (matiereClasseComboBox.getSelectedIndex() != 0) {
				// Donner l'element classe au model de la JTable
				filter = (Classe) matiereClasseComboBox.getSelectedItem();
			}
			((ModeleListeEleves) elevesTable.getModel()).filterByClasse(filter);
			elevesTable.updateUI();
		}
	}
}
